package com.atguigu.common.utils;

import com.alibaba.fastjson.TypeReference;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;

/**
 * 返回数据
 *
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2016年10月27日 下午9:59:27
 */
@SuppressWarnings("all")
public class R extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;


    /*
     * 这里没用 是因为JackSon对于HashMap类型会有特殊的处理方式，
     * 具体来说就是会对类进行向上转型为Map，导致子类的私有属性效时
     * */

    /**
     * @param key 获取指定key的名字
     *            利用FastJson进行反序列化
     */
    public <T> T getData(String key, TypeReference<T> typeReference) {
        // get("data") 默认是map类型 所以再由map转成string再转json
        Object data = get(key);
        return JSON.parseObject(JSON.toJSONString(data), typeReference);
    }

    /**
     * 复杂类型转换 TypeReference
     * 利用FastJson进行反序列化
     * TypeReference作用：在有泛型的对象中，在反序列化时，将数据封装成泛型对象
     */
    public <T> T getData(TypeReference<T> typeReference) {
        // get("data") 默认是map类型 所以再由map转成string再转json
        Object data = get("data");
        return JSON.parseObject(JSON.toJSONString(data), typeReference);
    }

    //因为它是一个map，放数据的时候还是以map放
    public R setData(Object data) {
        put("data", data);
        return this;
    }

    public R() {
        put("code", 0);
    }

    public static R error() {
        return error(500, "未知异常，请联系管理员");
    }

    public static R error(String msg) {
        return error(500, msg);
    }

    public static R error(int code, String msg) {
        R r = new R();
        r.put("code", code);
        r.put("msg", msg);
        return r;
    }

    public static R ok(String msg) {
        R r = new R();
        r.put("msg", msg);
        return r;
    }

    public static R ok(Map<String, Object> map) {
        R r = new R();
        r.putAll(map);
        return r;
    }

    public static R ok() {
        return new R();
    }

    public R put(String key, Object value) {
        super.put(key, value);
        return this;
    }

    public Integer getCode() {

        return (Integer) this.get("code");
    }


}
